package com.yeren.deque;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 1.Deque是Queue的子接口，定义了所谓“双端队列”， 即队列的两端均可以入队与出队，LinkList实现了该接口。
 * 2.当我们将Deque限为只能从队列的一段出队与入队， 就形成了经典的数据结构“栈”(Stack), 入栈称之为push，出栈称之为pop。
 * 3.栈存取元素遵循先进后出原则(FILO First Input Last Output) 4.栈在实际应用中通常都是用于实现一系列的操作有可追溯性。
 * 可以使用栈完成“前进”，“后退”
 */
public class DequeDemo {

	public static void main(String[] args) {

		// fun1();
		fun2();
		// fun3();
		// fun4();
		// fun5();
	}

	/**
	 * 站结构 存取本着先进后出原则
	 */
	private static void fun1() {
		// java.util.Deque
		Deque<String> deque = new LinkedList<String>();
		deque.push("A");
		deque.push("B");
		deque.push("C");
		deque.push("D");
		deque.push("E");
		deque.push("F");

		System.out.println(deque);// [F, E, D, C, B, A]
		/**
		 * 遍历栈结构
		 */
		while (deque.peek() != null) {
			String element = deque.pop();
			System.out.println(element);
		}
		System.out.println(deque);
	}

	private static void fun2() {
		Deque<String> stack = new LinkedList<String>();
		// 入栈方法
		stack.push("one");
		stack.push("two");
		stack.push("three");
		stack.push("four");
		stack.push("five");
		System.out.println(stack);
		// 引用栈顶元素，但不出栈
		String str = stack.peek();
		System.out.println("栈顶元素：" + str);
		System.out.println(stack);
	}

	private static void fun3() {
		/**
		 * 第一种遍历方法
		 */
		Deque<String> stack = new LinkedList<String>();
		// 入栈方法
		stack.push("one");
		stack.push("two");
		stack.push("three");
		stack.push("four");
		stack.push("five");
		while (stack.size() > 0) {
			String str = stack.pop();
			System.out.println(str);
		}
	}

	private static void fun4() {
		/**
		 * 第二种遍历方法
		 */
		Deque<String> stack = new LinkedList<String>();
		// 入栈方法
		stack.push("one");
		stack.push("two");
		stack.push("three");
		stack.push("four");
		stack.push("five");
		for (; stack.size() > 0;) {
			String str = stack.pop();
			System.out.println(str);
		}
	}

	private static void fun5() {
		/**
		 * 第三种遍历方法
		 */
		Deque<String> stack = new LinkedList<String>();
		// 入栈方法
		stack.push("one");
		stack.push("two");
		stack.push("three");
		stack.push("four");
		stack.push("five");
		for (int i = stack.size(); i > 0; i--) {
			String str = stack.pop();
			System.out.println(str);
		}
	}

}
